package agent.monitors;
import java.io.FileNotFoundException;
import java.util.Timer;
import java.util.TimerTask;

public class TorrentMonitorImpl {
	private static final int DEFAULT_PERIOD = 10000;
	
	private static final TorrentMonitorImpl	instance	= new TorrentMonitorImpl();
	private Timer						timer;
	private TorrentMonitorTask				monitorTask;
	private OriginChangeListener			listener;
	private TorrentMonitor 				monitor;
	
	public static TorrentMonitorImpl getInstance() {
		return TorrentMonitorImpl.instance;
	}
	
	private TorrentMonitorImpl() {
		this.timer = new Timer(true);
	}
	
	/**
	 * Inicia o monitoramento do torrent com intervalos de tempo padrão de {@value #DEFAULT_PERIOD}.
	 * 
	 * @param torrentInterface
	 * 			Interface a ser monitorada.
	 * @param listener
	 * 			Evento que irá ser ser chamado no momento que houver alterações no arquivo.
	 * 
	 * @throws FileNotFoundException
	 * 			Caso o arquivo não exista.
	 */
	public void startMonitor(TorrentInterface torrentInterface, OriginChangeListener listener) throws FileNotFoundException {
		this.startMonitor(torrentInterface, DEFAULT_PERIOD, listener);
		torrentInterface.updateValues();
		this.originChanged();
	}
	
	/**
	 * Inicia o monitoramento do torrent com intervalos de tempo {@code period}.
	 * 
	 * @param torrentInterface
	 * 			Interface a ser monitorada.
	 * @param period
	 * 			Intervalo de tempo entre verificações
	 * @param listener
	 * 			Evento que irá ser ser chamado no momento que houver alterações no arquivo.,
	 * 
	 * @throws FileNotFoundException
	 * 			Caso o arquivo não exista.
	 */
	public void startMonitor(TorrentInterface torrentInterface, long period, OriginChangeListener listener) throws FileNotFoundException {
		this.stopMonitor();
		this.monitor = torrentInterface;
		this.monitorTask = new TorrentMonitorTask(torrentInterface);
		this.listener = listener;
		this.timer.schedule(this.monitorTask, period, period);
	}
	
	/**
	 * Para o monitoramento do arquivo.
	 */
	public void stopMonitor() {
		if (this.monitorTask != null) {
			this.monitorTask.cancel();
		}
	}
	
	protected void originChanged(){
		this.listener.originChanged(this.monitor);
	}
	
	public TorrentMonitor getMonitor(){
		return this.monitor;
	}
	
	/**
	 * Classe de monitoração
	 */
	class TorrentMonitorTask extends TimerTask {
		private TorrentInterface watcher;
		
		public TorrentMonitorTask(TorrentInterface watcher) throws FileNotFoundException {
			this.watcher = watcher;
		}
		
		public void run() {
			if (this.watcher.updateValues()){
				//originChanged();
			}
		}
	}
}